#ifndef QREMOTE_FUNCTION_H
#define QREMOTE_FUNCTION_H

#include "QRemoteObject2.h"
#include "QRemoteObjectAdvance_global.h"

class QREMOTEOBJECTADVANCE_EXPORT QRemoteFunction
{
public:
    QRemoteFunction(QObject* _this);

    virtual ~QRemoteFunction();

    //发射信号
    template<typename ...Args>
    void emits(QString func,Args... arg){
        QRemoteObject2::emits(_this,func,arg...);
    }

    //调用函数
    template<typename ...Args>
    void invoke(QString func,QRemoteObject2::InvokeCallBack callBack,Args... arg){
        QRemoteObject2::invoke(_this,func,callBack,arg...);
    }

    //修改属性
    void pushProperty(const char* name,QVariant value);

    //修改父级
    void pushParent(QObject* parent);

    //将另一个对象注册到和本对象相同的网络接口中（本对象必须已经通过网络接口共享，并且只能是服务端）
    void registerItem(QObject* item);

    void unregisterThis();//注销自身
    void deleteThis();//析构自身（不建议使用deleteLater或delete来析构对象，会导致Offline对象执行环境异常，建议使用deleteThis）
    void deleteThisLater();

//    //以静态方式注册，同上
//    void registerItemStatic(QRemoteItem* item,QString name = {});
    //该对象注册和注销时自动调用的函数
    virtual void onOnline();
    virtual void onOffline();

    //判断该对象是源还是副本
    bool isSource();
    bool isReplica();

    //判断该对象是否被本端占用
    bool isOccupied();

    void occupy();//占领该对象
    void release();//释放该对象
    QObject* occupiedObject();//获取该对象对应的网络接口所占领的对象

    virtual void onOccupied();//被客户端占领时（源和副本都会执行)
    virtual void onReleased();//被客户端释放时

private:
    QObject* _this;
};

#endif

